package com.lzx.adx.report.support.strategy.v3.channel;

import cn.hutool.core.util.ReflectUtil;
import com.google.common.collect.Sets;
import com.lzs.adx.commmon.constant.RedisCacheKey;
import com.lzs.adx.commmon.enums.ReportEnums;
import com.lzs.adx.commmon.redis.RedisUtils;
import com.lzs.adx.commmon.utils.DateUtils;
import com.lzs.adx.commmon.utils.Result;
import com.lzs.adx.commmon.utils.SpringContextUtils;
import com.lzx.adx.report.dto.OcpxAccountDTO;
import com.lzx.adx.report.dto.ProductConfigDTO;
import com.lzx.adx.report.dto.ReportDTO;
import com.lzx.adx.report.util.AdPerUtil;
import com.lzx.adx.report.util.DynamicRequestLimiter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.ResponseEntity;

import java.util.*;

@Slf4j
public abstract class AbstractProductReport<T> {

    /**
     * 正常上报业务
     * @param reportDTO
     * @param ocpxAccountDTO
     * @param productConfigDTO
     * @return
     */
    public abstract String execute(ReportDTO reportDTO, OcpxAccountDTO ocpxAccountDTO, ProductConfigDTO productConfigDTO);


    /**
     * 虚拟回传上报
     * @param reportDTO
     * @param accountDTO
     * @return
     */
    public String virtual(ReportDTO reportDTO, OcpxAccountDTO accountDTO) {
        RedisUtils redisUtils = SpringContextUtils.getBean(RedisUtils.class);
        Double per = accountDTO.getPer();
        if (Objects.nonNull(per)) {
            //渠道比例
            if (AdPerUtil.randomPer(per)) {
                //通过的
                redisUtils.setCacheSet(RedisCacheKey.VIRTUAL_ACCOUNT_DSPID, Sets.newHashSet(accountDTO.getId()));
                String key = String.format(RedisCacheKey.VIRTUAL_RESULT_CALLBACK_ACCOUNT, accountDTO.getId());
                redisUtils.addToList(key, reportDTO.getBizRequestId());
            }
        }
        return "success";
    }


    /**
     * 通用的可回传功能
     * @param per
     * @return
     */
    public  boolean shouldIdentifyAd(Double per) {
        Random random = new Random();
        double randomValue = random.nextDouble(); // 生成到1之间的随机数
        log.info("随机数为{}", randomValue);
        return randomValue > per;
    }

}
